<?php
namespace app\service;

use app\model\{ChatSession, ChatMessage, User};
use think\facade\Log;
use Exception;

class TopicCompletionService
{
    protected $aiService;
    protected $chatService;

    public function __construct()
    {
        $this->aiService = new AiService();
        $this->chatService = new ChatService();
    }
    /**
     * 检查话题完成度
     * 
     * 该方法用于:
     * 1. 分析当前会话中的最近对话内容
     * 2. 判断当前话题是否已经完成
     * 3. 返回是否可以开始新话题的判断结果
     * 
     * @param ChatSession $session 聊天会话对象,包含会话ID等信息
     * @param User $user 当前用户对象,用于权限验证
     * @return array 返回包含next字段的数组,next=1表示可以开始新话题,next=0表示需继续当前话题
     * @throws Exception 当AI服务调用失败或响应解析失败时抛出异常
     */
    const RECENT_MESSAGES_COUNT = 5; // 提取最近的对话消息数量

    public function checkCompletion(ChatSession $session, User $user): array
    {
        try {
            // 获取最近的对话历史
            $history = $this->chatService->getSessionHistory($session->id);

            // 提取最近的对话内容
            $recentMessages = array_slice($history, -self::RECENT_MESSAGES_COUNT);
            $conversationText = '';
            foreach ($recentMessages as $msg) {
                $role = $msg['role'] === 'user' ? '用户' : 'AI';
                $conversationText .= "{$role}: {$msg['content']}\n";
            }

            // 构建单条系统提示
            $history = [[
                'role' => 'system',
                'content' => "请分析以下对话内容,判断当前话题是否已经完成。

最近的对话内容:
{$conversationText}

请以JSON格式输出你的判断:
{
    \"next\": 1或0  // 1表示可以继续新话题,0表示需要继续当前话题
}"
            ]];

            // 用于存储响应
            $responseText = '';
            
            // 调用AI服务
            $this->aiService->streamChat($history, function($chunk) use (&$responseText) {
                $responseText .= $chunk;
            });

            // 解析响应
            if (preg_match('/\{.*\}/s', $responseText, $matches)) {
                $result = json_decode($matches[0], true);
                if ($result && isset($result['next'])) {
                    $completionResult = [
                        'next' => (int)$result['next']
                    ];
                    
                    // 修改这里：将数组转为 JSON 字符串再记录日志
                    Log::debug('话题完成度检查结果：' . json_encode($completionResult, JSON_UNESCAPED_UNICODE));
                    
                    return $completionResult;
                }
            }

            throw new Exception('无法解析AI响应：' . $responseText);

        } catch (Exception $e) {
            Log::error('话题完成度检查失败：' . json_encode([
                'session_id' => $session->id,
                'error' => $e->getMessage()
            ], JSON_UNESCAPED_UNICODE));
            throw $e;
        }
    }
}
